[Lighttpd] w chroot z obsługą PHP i MySQL
Kategoria: FAQ, etykiety: bazy danych, lighttpd
Dodany: 2010-09-28 15:27
(zmodyfikowany: 2011-04-17 23:29)
Przez: life
Wyświetleń: 7988
Opis powstał w oparciu o informacje znajdujące się na stronie: http://www.cyberciti.biz
Rozwiązanie to testowałem w Debian 5 (Lenny) wersja 32 bit.
Zakładam że masz już zainstalowanego Lighttpd oraz PHP oraz MySQL jeśli nie to instalujemy: PHP z Lighttpd działa w trybie Fast-CGI tak więc musiamy zainstalować pakiet php5-cgi
# apt-get install lighttpd php5-cgi php5-mysql mysql-server
Teraz przystąpimy do przygotowania środowiska w którym będą działać usługi.
Zakładamy katalog /chroot:
# mkdir /chroot
Nasz chroot powinien mieć niezbędną struturę i system katalogów normalnego systemu, dlatego też zakładamy następujące podkatalogi i uprawnienia dla nich:
# mkdir /chroot/tmp/
# chmod 1777 /chroot/tmp/
# mkdir /chroot/etc
Katalog w którym będziemy trzymać logi Lighttpd:
# mkdir -p /chroot/var/log/lighttpd
Lighttpd domyślnie działa na uprawnieniach użytkownika www-data dlatego też zmieniamy właściciela katalogu w którym będziemy trzymać logi:
# chown www-data:www-data /chroot/var/log/lighttpd
Utworzymy katalogi w których Lighttpd trzyma cache:
# mkdir -p /chroot/var/tmp/lighttpd/cache/compress/
# chown www-data:www-data /chroot/var/tmp/lighttpd/cache/compress/
Oraz katalog do którego uploadowane są pliki:
# mkdir -p /chroot/var/cache/lighttpd/uploads
# chown www-data:www-data /chroot/var/cache/lighttpd/uploads
Tworzymy katalog domowy użytkownika w którym będziemy trzymać stronę:
# mkdir -p /chroot/home/lighttpd
# chown www-data:www-data /chroot/home/lighttpd
# chmod 0700 /chroot/home/lighttpd
Przy tworzeniu środowiska chroot przydatny jest skrypt l2chroot, który automatyzuje kopiowanie plików i bibliotek do nowego środowiska.
#!/bin/bash
BASE="/webroot"
if [ $# -eq 0 ]; then
echo "Syntax : $0 /path/to/executable"
echo "Example: $0 /usr/bin/php5-cgi"
exit 1
fi
[ ! $BASE ] && mkdir -p $BASE || :
# iggy ld-linux* file as it is not shared one
FILES="$(ldd $1 | awk '{ print $3 }' |egrep -v ^'\(')"
echo "Copying shared files/libs to $BASE..."
for i in $FILES
do
d="$(dirname $i)"
[ ! -d $BASE$d ] && mkdir -p $BASE$d || :
/bin/cp $i $BASE$d
done
# copy /lib/ld-linux* or /lib64/ld-linux* to $BASE/$sldlsubdir
# get ld-linux full file location
sldl="$(ldd $1 | grep 'ld-linux' | awk '{ print $1}')"
# now get sub-dir
sldlsubdir="$(dirname $sldl)"
if [ ! -f $BASE$sldl ];
then
echo "Copying $sldl $BASE$sldlsubdir..."
/bin/cp $sldl $BASE$sldlsubdir
else
:
fi
Można go pobrać tu l2chroot.
Skrypt zapisujemy na dysku i nadajemy mu uprawnienia do wykonywania:
# wget http://www.cyberciti.biz/files/lighttpd/l2chroot.txt
# cp l2chroot.txt /bin/l2chroot
# chmod +x /bin/l2chroot
Teraz potrzebujemy umieścić w chroot PHP wraz z modułami których będziemy potrzebować. Zaczniemy od utworzenia katalogów w których przechowywane są binaria oraz biblioteki:
# mkdir -p /chroot/usr/bin
# cp /usr/bin/php5-cgi /chroot/usr/bin/
# cp /usr/bin/php5 /chroot/usr/bin/
Kolejnym etapem jest przekopiowanie plików konfiguracyjnych (wraz z uprawnieniami) dla PHP:
# cd /chroot/etc/
# cp -avr /etc/php5 .
Potrzebujemy jeszcze skopiować inne pliki konfiguracyjne z katalogu /etc
# cp /etc/hosts /chroot/etc/
# cp /etc/nsswitch.conf /chroot/etc/
# cp /etc/resolv.conf /chroot/etc/
# cp /etc/services /chroot/etc/
# cp /etc/localtime /chroot/etc/
Przy pomocy skryptu l2chroot kopiujemy pliki binarne i biblioteki dl PHP:
# /bin/l2chroot /usr/bin/php5-cgi
# /bin/l2chroot /usr/bin/php-cgi
Do poprawnego działana chroot potrzebujemy jeszcze biblioteki ld-linux.so.2 :
# cp /lib/ld-linux.so.2 /chroot/lib
Teraz zabierzemy się za moduły dla PHP, które również umieścimy w chroot. Zaczniemy od sprawdzenia gdzie pliki się znajdują na dysku:
# dpkg -L php5-mysql
/.
/usr
/usr/share
/usr/share/doc
/usr/lib
/usr/lib/php5
/usr/lib/php5/20060613+lfs
/usr/lib/php5/20060613+lfs/mysql.so
/usr/lib/php5/20060613+lfs/mysqli.so
/usr/lib/php5/20060613+lfs/pdo_mysql.so
/etc
/etc/php5
/etc/php5/conf.d
/etc/php5/conf.d/mysql.ini
/etc/php5/conf.d/mysqli.ini
/etc/php5/conf.d/pdo_mysql.ini
/usr/share/doc/php5-mysql
Nas interesuja następujące linie:
/usr/lib/php5/20060613+lfs/mysql.so
/usr/lib/php5/20060613+lfs/mysqli.so
/usr/lib/php5/20060613+lfs/pdo_mysql.so
Są to ścieżki do plików z modułami do sterownika bazy danych MySQL.
Musimy założyć katalog dla modułów a następnie skopiować je:
# mkdir -p /chroot/usr/lib/php4/20050606
# cp /usr/lib/php5/20060613+lfs/mysql.so /chroot/usr/lib/php5/20060613+lfs/
# cp /usr/lib/php5/20060613+lfs/mysqli.so /chroot/usr/lib/php5/20060613+lfs/
# cp /usr/lib/php5/20060613+lfs/pdo_mysql.so /chroot/usr/lib/php5/20060613+lfs/
Przy pomocy skryptu l2chroot kopiujemy potrzebne biblioteki:
# /bin/l2chroot /usr/lib/php5/20060613+lfs/mysql.so
# /bin/l2chroot /usr/lib/php5/20060613+lfs/mysqli.so
# /bin/l2chroot /usr/lib/php5/20060613+lfs/pdo_mysql.so
Powyższe czynności należy powtórzyć dla innych modułów jakich używamy jak GD, xcache itp.
Teraz przejdziemy do konfiguracji Lighttpd z obsługą PHP. Posłuży nam do tego skrypt lighty-enable-mod, dostarczany wraz z lighttpd.
# lighty-enable-mod fastcgi
Pozostaje jeszcze edycja pliku konfiguracyjnego Lighttpd (/etc/lighttpd/lighttpd.conf ). Otwieramy w naszym ulubionym edytorze tekstu i zmieniamy (edytujemy) linie:
server.chroot = "/chroot"
Domyślnie jest za komentowana znakiem „#”.
server.document-root = "/home/lighttpd/"
Zanim zrestartujemy Lighttpd musimy wykonać jeszcze jedną czynność. Połączenie z bazą danych MySQL poprzez moduł mysql.so lub mysqli.so (wersja obiektowa). Powinna działać bez problemu, gorzej spraw się ma z obsługą PDO. Pomimo że komunikacja PHP – MySQL odbywa się poprzez połączenie TCP to najprawdopodobniej samo PDO używa gniazda do łącznie się z bazą danych (socket).
Domyślnie gniazdo dla MySQL znajduje się w katalogu /var/run/mysqld/mysqld.sock
Z poziomu chroot będzie ono niedostępne dlatego musimy zmienić jego pomożenie. Najpierw utworzymy katalog i zmienimy jego właściciela na mysql:
# mkdir -p /chroot/var/run/mysqld/
# chown mysql /chroot/var/run/mysqld/
Następnie edytujemy plik konfiguracyjny MySQL (/etc/mysql/my.cnf) i zmieniamy miejsce gdzie ma być zapisane gniazdo:
[client]
socket = /chroot/var/run/mysqld/mysqld.sock
[mysqld_safe]
socket = /chroot/var/run/mysqld/mysqld.sock
[mysqld]
socket = /chroot/var/run/mysqld/mysqld.sock
Debian posiada dodatkowe skrypty monitorujące pracę MySQL, musimy je powiadomić o tym, że plik gniazda zmienił swoje domyślne położenie. Edytujemy plik /etc/mysql/debian.cnf i sekcję socket ustawiamy na: socket = /chroot/var/run/mysqld/mysqld.sock
Teraz możemy zrestartować serwer bazy danych oraz lighttpd:
# /etc/init.d/mysql restart
# /etc/init.d/lighttpd restart
Nasz Lighttpd z obsługą PHP i MySQL powinien działać w środowisku chroot.
Dla sprawdzenia poprawności działania można użyć fuknkcji phpinfo() z PHP.
W katalogu /chroot/home/lighttpd tworzymy plik plik test.php i wpisujemy do niego zawartość:
<?php
phpinfo();
?>
Wchodząc na adres http://naszadresip/test.php powinniśmy zobaczyć rezultat działania funkcji phpinfo()